package v1

import (
	"github.com/gin-gonic/gin"
	"github.com/spf13/cast"
	"hr/api/dto"
	"hr/api/middleware"
	"hr/db"
	"hr/utils"
)

// GetDictValue
// @Summary 根据字典id获取相关键值
// @Tags 字典相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param dictId path string true "字典ID"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/dictValue/{dictId} [get]
func GetDictValue(c *gin.Context)  {
	dictIdStr := c.Param("dictId")
	if utils.IsStringEmpty(dictIdStr) {
		utils.EchoError(c,"缺少字典ID")
		return
	}
	_, _ ,tag := db.GetDict(map[string]interface{}{"id": cast.ToUint(dictIdStr)})
	if tag == "0" || tag == "1" {
		utils.EchoError(c, "该字典不存在")
		return
	}

	d, err := db.GetDictValue(cast.ToUint(dictIdStr))
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, d, "请求成功")
	return
}

// CreateDictValue
// @Summary 创建字典键值
// @Tags 字典相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param DictValueRequest body dto.DictValueRequest true "信息"
// @Param dictId path string true "字典ID"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/dictValue/{dictId} [post]
func CreateDictValue(c *gin.Context)  {
	dictIdStr := c.Param("dictId")
	if utils.IsStringEmpty(dictIdStr) {
		utils.EchoError(c,"缺少字典ID")
		return
	}
	p := &dto.DictValueRequest{}
	if err := c.ShouldBindJSON(p); err != nil {
		utils.EchoError(c,"缺少必要参数信息")
		return
	}
	_,_, tag := db.GetDict(map[string]interface{}{
		"id": dictIdStr,
	})
	if tag == "0" || tag == "1" {
		utils.EchoError(c, "该字典不存在")
		return
	}

	_,_, tag = db.GetDictValueByParams(map[string]interface{}{
		"tag": p.Tag,
	})
	if tag == "2" {
		utils.EchoError(c, "该字典键值已存在")
		return
	}

	id, _ := middleware.GetCurrentUserId(c)
	d, err := db.CreateDictValue(*p, cast.ToString(id), cast.ToUint(dictIdStr))
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, d, "创建成功")
	return
}

// UpdateDictValue
// @Summary 更新单个字典键值
// @Tags 字典相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param DictValueRequest body dto.DictValueRequest true "信息"
// @Param id path string true "字典键值ID"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/dictValue/{id} [put]
func UpdateDictValue(c *gin.Context)  {
	idStr := c.Param("id")
	if utils.IsStringEmpty(idStr) {
		utils.EchoError(c,"缺少字典键值ID")
		return
	}
	p := &dto.DictValueRequest{}
	if err := c.ShouldBindJSON(p); err != nil {
		utils.EchoError(c,"缺少必要参数信息")
		return
	}
	_,_, tag := db.GetDictValueByParams(map[string]interface{}{
		"id": idStr,
	})
	if tag == "0" || tag == "1" {
		utils.EchoError(c, "该字典键值不存在")
		return
	}
	id, _ := middleware.GetCurrentUserId(c)
	d, err := db.UpdateDictValue(cast.ToUint(idStr),*p, cast.ToString(id))
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, d, "更新成功")
	return
}

// DeleteDictValue
// @Summary 删除单个字典键值
// @Tags 字典相关api
// @Accept  json
// @Produce json
// @Param Access-Token header string true "Authentication header"
// @Param id path string true "字典键值ID"
// @Success 200 {object} utils.JsonContent
// @Failure 400 {object} utils.JsonContent
// @Failure 500 {object} utils.JsonContent
// @Router /api/v1/auth/dictValue/{id} [delete]
func DeleteDictValue(c *gin.Context)  {
	idStr := c.Param("id")
	if utils.IsStringEmpty(idStr) {
		utils.EchoError(c,"缺少字典键值ID")
		return
	}
	_,_, tag := db.GetDictValueByParams(map[string]interface{}{
		"id": idStr,
	})
	if tag == "0" || tag == "1" {
		utils.EchoError(c, "该字典键值不存在")
		return
	}
	_, err := db.DeleteDictValue(cast.ToUint(idStr))
	if err != nil {
		utils.EchoError(c, err.Error())
		return
	}
	utils.EchoSuccess(c, nil, "删除成功")
	return
}
